import { defineStore } from "pinia";
import { ref } from "vue";
import { getLoginUserUsingGet } from "@/api/userController";
import ACCESS_ENUM from "@/access/accessEnum";
import checkAccess from "@/access/checkAccess";

// 定义 localStorage 中存储用户信息的 key
const USER_INFO_KEY = "login_user";
// 用户登录时间 key
const LOGIN_TIME_KEY = "login_time";
// 会话有效期（24小时，单位毫秒）
const SESSION_TIMEOUT = 24 * 60 * 60 * 1000;

/**
 * 登录用户信息全局状态
 */
export const useLoginUserStore = defineStore("loginUser", () => {
  // 从 localStorage 初始化用户信息
  const getInitialUserState = (): API.LoginUserVO => {
    const savedUser = localStorage.getItem(USER_INFO_KEY);
    const loginTime = localStorage.getItem(LOGIN_TIME_KEY);

    // 检查登录时间是否有效
    if (savedUser && loginTime) {
      const currentTime = new Date().getTime();
      const loginTimeValue = parseInt(loginTime);

      // 如果会话超时，清除用户信息并返回未登录状态
      if (currentTime - loginTimeValue > SESSION_TIMEOUT) {
        localStorage.removeItem(USER_INFO_KEY);
        localStorage.removeItem(LOGIN_TIME_KEY);
        return {
          userName: "未登录",
          userRole: ACCESS_ENUM.NOT_LOGIN,
        };
      }

      // 会话有效，返回缓存的用户信息
      return JSON.parse(savedUser);
    }

    // 无缓存或登录时间信息，返回未登录状态
    return {
      userName: "未登录",
      userRole: ACCESS_ENUM.NOT_LOGIN,
    };
  };

  const loginUser = ref<API.LoginUserVO>(getInitialUserState());

  function setLoginUser(newLoginUser: API.LoginUserVO) {
    loginUser.value = newLoginUser;
    // 保存到 localStorage
    localStorage.setItem(USER_INFO_KEY, JSON.stringify(newLoginUser));
    // 更新登录时间
    localStorage.setItem(LOGIN_TIME_KEY, String(new Date().getTime()));
  }

  async function fetchLoginUser() {
    try {
      const res = await getLoginUserUsingGet();
      if (res.data.code === 0 && res.data.data) {
        setLoginUser(res.data.data); // 使用 setLoginUser 来保存用户信息
        return true;
      } else {
        clearLoginUser(); // 清除用户信息
        return false;
      }
    } catch (error) {
      clearLoginUser(); // 清除用户信息
      return false;
    }
  }

  // 清除用户信息
  async function clearLoginUser() {
    localStorage.removeItem(USER_INFO_KEY);
    localStorage.removeItem(LOGIN_TIME_KEY);
    loginUser.value = {
      userName: "未登录",
      userRole: ACCESS_ENUM.NOT_LOGIN,
      userAvatar: undefined, // 确保清除头像
    };
  }

  // 验证当前登录状态是否有效
  async function validateLoginStatus() {
    // 如果本地没有用户信息，直接返回 false
    if (!localStorage.getItem(USER_INFO_KEY)) {
      return false;
    }

    // 检查登录时间
    const loginTime = localStorage.getItem(LOGIN_TIME_KEY);
    if (loginTime) {
      const currentTime = new Date().getTime();
      const loginTimeValue = parseInt(loginTime);

      // 如果会话超时，清除用户信息
      if (currentTime - loginTimeValue > SESSION_TIMEOUT) {
        clearLoginUser();
        return false;
      }
    }

    // 向后端验证登录状态
    return await fetchLoginUser();
  }

  // 更新用户信息
  async function updateUserInfo(updatedFields: Partial<API.LoginUserVO>) {
    // 合并现有用户信息与更新字段
    const updatedUser = {
      ...loginUser.value,
      ...updatedFields,
    };

    // 更新状态
    loginUser.value = updatedUser;

    // 更新本地存储
    localStorage.setItem(USER_INFO_KEY, JSON.stringify(updatedUser));

    // 不更新登录时间，保持原有登录时间不变
    return true;
  }

  // 检查是否有特定权限
  function hasAccess(
    requireRole: (typeof ACCESS_ENUM)[keyof typeof ACCESS_ENUM]
  ) {
    return checkAccess(loginUser.value, requireRole);
  }

  // 是否已登录
  const isLoggedIn = () => loginUser.value.userRole !== ACCESS_ENUM.NOT_LOGIN;

  return {
    loginUser,
    setLoginUser,
    fetchLoginUser,
    clearLoginUser,
    validateLoginStatus,
    updateUserInfo,
    hasAccess,
    isLoggedIn,
  };
});
